#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
邮件发送模块
支持多种邮件服务商
"""

import smtplib
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from typing import List, Dict, Any, Optional


class EmailSender:
    """邮件发送处理类"""
    
    def __init__(self, config: Dict[str, Any]):
        """
        初始化邮件发送器
        
        Args:
            config: 邮件配置信息
        """
        self.config = config
        self.smtp_server = config.get('smtp_server', 'smtp.qq.com')
        self.smtp_port = config.get('smtp_port', 587)
        self.sender_email = config.get('sender_email', '')
        self.sender_password = config.get('sender_password', '')
        self.logger = logging.getLogger(__name__)
        
        # 常见邮件服务商配置
        self.smtp_configs = {
            'qq.com': {'server': 'smtp.qq.com', 'port': 587, 'use_tls': True},
            '163.com': {'server': 'smtp.163.com', 'port': 25, 'use_tls': True},
            '126.com': {'server': 'smtp.126.com', 'port': 25, 'use_tls': True},
            'gmail.com': {'server': 'smtp.gmail.com', 'port': 587, 'use_tls': True},
            'outlook.com': {'server': 'smtp-mail.outlook.com', 'port': 587, 'use_tls': True},
            'hotmail.com': {'server': 'smtp-mail.outlook.com', 'port': 587, 'use_tls': True},
            'sina.com': {'server': 'smtp.sina.com', 'port': 25, 'use_tls': True}
        }
        
        self._auto_config_smtp()
    
    def _auto_config_smtp(self):
        """根据发送者邮箱自动配置SMTP服务器"""
        if not self.sender_email:
            return
            
        domain = self.sender_email.split('@')[-1].lower()
        if domain in self.smtp_configs:
            smtp_config = self.smtp_configs[domain]
            if not self.smtp_server or self.smtp_server == 'smtp.qq.com':
                self.smtp_server = smtp_config['server']
            if not self.smtp_port or self.smtp_port == 587:
                self.smtp_port = smtp_config['port']
            self.logger.info(f"自动配置SMTP服务器：{self.smtp_server}:{self.smtp_port}")
    
    def validate_config(self) -> bool:
        """验证邮件配置"""
        if not self.sender_email:
            self.logger.error("发送者邮箱未配置")
            return False
        if not self.sender_password:
            self.logger.error("发送者邮箱密码未配置")
            return False
        if not self.smtp_server:
            self.logger.error("SMTP服务器未配置")
            return False
        return True
    
    def create_message(self, subject: str, content: str, recipients: List[str]) -> MIMEMultipart:
        """
        创建邮件消息
        
        Args:
            subject: 邮件主题
            content: 邮件内容
            recipients: 收件人列表
            
        Returns:
            MIMEMultipart: 邮件消息对象
        """
        msg = MIMEMultipart()
        msg['From'] = self.sender_email  # 使用简单格式避免编码问题
        msg['To'] = ', '.join(recipients)
        msg['Subject'] = str(Header(subject, 'utf-8'))
        
        # 添加邮件内容
        html_content = self._convert_to_html(content)
        msg.attach(MIMEText(html_content, 'html', 'utf-8'))
        
        return msg
    
    def _convert_to_html(self, content: str) -> str:
        """将文本内容转换为HTML格式"""
        # 简单的文本到HTML转换
        html_content = content.replace('\n', '<br>')
        
        # 添加emoji样式
        emoji_replacements = {
            '📅': '<span style="font-size: 1.2em;">📅</span>',
            '🌤️': '<span style="font-size: 1.2em;">🌤️</span>',
            '⏰': '<span style="font-size: 1.2em;">⏰</span>',
            '💡': '<span style="font-size: 1.2em;">💡</span>',
            '📧': '<span style="font-size: 1.2em;">📧</span>',
            '🕐': '<span style="font-size: 1.2em;">🕐</span>',
            '✅': '<span style="color: green; font-size: 1.2em;">✅</span>',
            '❌': '<span style="color: red; font-size: 1.2em;">❌</span>'
        }
        
        for emoji, replacement in emoji_replacements.items():
            html_content = html_content.replace(emoji, replacement)
        
        # 完整的HTML模板
        html_template = f"""
        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="UTF-8">
            <style>
                body {{
                    font-family: 'Microsoft YaHei', Arial, sans-serif;
                    line-height: 1.6;
                    color: #333;
                    max-width: 600px;
                    margin: 0 auto;
                    padding: 20px;
                    background-color: #f5f5f5;
                }}
                .container {{
                    background-color: white;
                    border-radius: 10px;
                    padding: 30px;
                    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
                }}
                .header {{
                    text-align: center;
                    color: #2c3e50;
                    border-bottom: 2px solid #3498db;
                    padding-bottom: 10px;
                    margin-bottom: 20px;
                }}
                .section {{
                    margin: 20px 0;
                    padding: 15px;
                    background-color: #f8f9fa;
                    border-left: 4px solid #3498db;
                    border-radius: 5px;
                }}
                .footer {{
                    text-align: center;
                    color: #7f8c8d;
                    font-size: 0.9em;
                    margin-top: 30px;
                    padding-top: 20px;
                    border-top: 1px solid #ecf0f1;
                }}
            </style>
        </head>
        <body>
            <div class="container">
                <div class="header">
                    <h2>🌅 每日打卡提醒系统</h2>
                </div>
                <div class="content">
                    {html_content}
                </div>
                <div class="footer">
                    <p>This is an automatically sent email, please do not reply directly</p>
                </div>
            </div>
        </body>
        </html>
        """
        
        return html_template
    
    def send_email(self, subject: str, content: str, recipients: List[str]) -> bool:
        """
        发送邮件
        
        Args:
            subject: 邮件主题
            content: 邮件内容
            recipients: 收件人列表
            
        Returns:
            bool: 发送是否成功
        """
        if not self.validate_config():
            return False
        
        if not recipients:
            self.logger.error("收件人列表为空")
            return False
        
        try:
            # 创建邮件消息
            msg = self.create_message(subject, content, recipients)
            
            # 连接SMTP服务器
            self.logger.info(f"连接SMTP服务器：{self.smtp_server}:{self.smtp_port}")
            server = smtplib.SMTP(self.smtp_server, self.smtp_port)
            
            # 启用TLS加密
            server.starttls()
            
            # 登录邮箱
            self.logger.info(f"登录邮箱：{self.sender_email}")
            server.login(self.sender_email, self.sender_password)
            
            # 发送邮件
            self.logger.info(f"发送邮件到：{', '.join(recipients)}")
            text = msg.as_string()
            server.sendmail(self.sender_email, recipients, text)
            
            # 关闭连接
            server.quit()
            
            self.logger.info("邮件发送成功")
            return True
            
        except smtplib.SMTPAuthenticationError as e:
            self.logger.error(f"SMTP认证失败：{e}")
            self.logger.error("可能的解决方案：")
            self.logger.error("1. 检查邮箱账号和密码是否正确")
            self.logger.error("2. 如使用QQ邮箱，请使用授权码而不是登录密码")
            self.logger.error("3. 确保已开启邮箱的SMTP服务")
            return False
        except smtplib.SMTPConnectError as e:
            self.logger.error(f"SMTP连接失败：{e}")
            self.logger.error("请检查SMTP服务器地址和端口是否正确")
            return False
        except smtplib.SMTPException as e:
            self.logger.error(f"SMTP错误：{e}")
            return False
        except Exception as e:
            self.logger.error(f"发送邮件时出现未知错误：{e}")
            return False
    
    def test_connection(self) -> bool:
        """
        测试邮件服务器连接
        
        Returns:
            bool: 连接是否成功
        """
        if not self.validate_config():
            return False
        
        try:
            self.logger.info(f"测试连接到SMTP服务器：{self.smtp_server}:{self.smtp_port}")
            server = smtplib.SMTP(self.smtp_server, self.smtp_port)
            server.starttls()
            server.login(self.sender_email, self.sender_password)
            server.quit()
            
            self.logger.info("SMTP连接测试成功")
            return True
            
        except Exception as e:
            self.logger.error(f"SMTP连接测试失败：{e}")
            return False
    
    def get_setup_instructions(self) -> str:
        """获取邮箱设置说明"""
        domain = self.sender_email.split('@')[-1].lower() if self.sender_email else ''
        
        instructions = {
            'qq.com': """
QQ邮箱设置说明：
1. 登录QQ邮箱网页版
2. 进入"设置" -> "账户"
3. 找到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"
4. 开启"POP3/SMTP服务"或"IMAP/SMTP服务"
5. 获取授权码（不是QQ密码）
6. 在配置文件中使用授权码作为密码
""",
            '163.com': """
163邮箱设置说明：
1. 登录163邮箱网页版
2. 进入"设置" -> "POP3/SMTP/IMAP"
3. 开启"POP3/SMTP服务"
4. 设置客户端授权密码
5. 在配置文件中使用授权密码
""",
            'gmail.com': """
Gmail设置说明：
1. 启用两步验证
2. 生成应用专用密码
3. 在配置文件中使用应用专用密码
""",
            'outlook.com': """
Outlook邮箱设置说明：
1. 登录Outlook邮箱
2. 进入安全设置
3. 生成应用密码
4. 在配置文件中使用应用密码
"""
        }
        
        return instructions.get(domain, "请查阅您的邮箱服务商关于SMTP设置的说明文档")


# 测试函数
def test_email_sender():
    """测试邮件发送功能"""
    config = {
        'smtp_server': 'smtp.qq.com',
        'smtp_port': 587,
        'sender_email': '你的QQ邮箱@qq.com',
        'sender_password': '你的授权密码'
    }
    
    email_sender = EmailSender(config)
    
    # 测试连接
    if email_sender.test_connection():
        print("邮件服务器连接测试成功")
        
        # 发送测试邮件
        success = email_sender.send_email(
            subject="测试邮件",
            content="这是一封测试邮件，用于验证邮件发送功能。",
            recipients=['测试@qq.com']
        )
        
        if success:
            print("测试邮件发送成功")
        else:
            print("测试邮件发送失败")
    else:
        print("邮件服务器连接测试失败")
        print(email_sender.get_setup_instructions())


if __name__ == "__main__":
    test_email_sender()